package com.atguigu.gmall.product.client;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.product.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

@FeignClient(value = "service-product", fallback = ProductDegradeFeignClient.class)
public interface ProductFeignClient {

    /**
     * 根据 skuId 获取 SKU 基本信息和图片集合
     * @param skuId
     * @return
     */
    @GetMapping("/api/product/inner/getSkuInfo/{skuId}")
    Result<SkuInfo> getSkuInfo(@PathVariable("skuId") Long skuId);

    /**
     * 为了实现页面上面包屑（路径导航）功能，根据三级分类 id，查询路径中各级分类信息
     * @param category3Id
     * @return
     */
    @GetMapping("/api/product/inner/getCategoryView/{category3Id}")
    Result<BaseCategoryView> getCategoryView(
            @PathVariable("category3Id") Long category3Id);

    /**
     * 根据 skuId 查询价格。价格之所以要单独查询是因为 SKU 基本信息等数据要做缓存。
     * 而价格修改的几率较大，所以以后不查询缓存，直接查数据库，所以独立出来
     * @param skuId
     * @return
     */
    @GetMapping("/api/product/inner/getSkuPrice/{skuId}")
    Result<BigDecimal> getSkuPrice(@PathVariable("skuId") Long skuId);

    /**
     * 查询指定 spuId 下的销售属性和销售属性值
     * 根据指定 skuId 对销售属性值进行标记：把 SKU 选中的销售属性标记出来
     * @param skuId
     * @param spuId
     * @return
     */
    @GetMapping("/api/product/inner/getSpuSaleAttrListCheckBySku/{skuId}/{spuId}")
    Result<List<SpuSaleAttr>> getSpuSaleAttrListCheckBySku(
            @PathVariable("skuId") Long skuId,
            @PathVariable("spuId") Long spuId);

    /**
     * 构造一个 Map 集合，建立映射关系：从“销售属性值组合”到“skuId”
     * 用来给前端进行判断时使用
     * @param spuId
     * @return
     */
    @GetMapping("/api/product/inner/getSkuValueIdsMap/{spuId}")
    Result<Map<String, Object>> getSkuValueIdsMap(
            @PathVariable("spuId") Long spuId);

    @GetMapping("/api/product/inner/get/category/for/portal")
    Result<List<JSONObject>> getCategoryForPortal();

    @GetMapping("/admin/product/baseTrademark/get/{id}")
    Result<BaseTrademark> getTrademarkById(@PathVariable Long id);

    @GetMapping("/api/product/inner/get/attr/{skuId}")
    Result<List<BaseAttrInfo>> getBaseAttrInfoBySkuId(
            @PathVariable("skuId") Long skuId);
}
